/*
 * @Author: '龙佳鑫' '1554845699@qq.com'
 * @Date: 2024-10-11 23:05:47
 * @LastEditors: '龙佳鑫' '1554845699@qq.com'
 * @LastEditTime: 2024-10-21 18:59:45
 * @FilePath: \trip_server\index.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
const express = require("express");
const app = express();
const joi = require("joi");
var expressJWT = require("express-jwt"); //解析token中间件
const bodyParser = require("body-parser");
app.use(bodyParser.json());
const secret = require("./util/secret.js"); //导入全局配置文件
 const request = require('request')
var jwt_decode = require('jwt-decode');
// 注意：小程序端的appid必须使用真实账号，如果使用测试账号，会出现login code错误
const wx = {
  appid: 'wxa807439ace2e13c0',
  secret: '2592b6fd6403b1032bff3286fc6751b7'
}

var db = {
  session: {},
  user: {}
}

app.post('/login', (req, res) => {
  console.log('login code: ' + req.body.code)
  var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + wx.appid + '&secret=' + wx.secret + '&js_code=' + req.body.code + '&grant_type=authorization_code'
  request(url, (err, response, body) => {
    console.log('session: ' + body)
    var session = JSON.parse(body)
    if (session.openid) {
      var token = 'token_' + new Date().getTime()
      db.session[token] = session
      if (!db.user[session.openid]) {
        db.user[session.openid] = {
          credit: 100
        }
      }
    }
    res.json({
      token: token
    })
  })
})

app.get('/checklogin', (req, res) => {
  var session = db.session[req.query.token]
  console.log('checklogin: ', session)
    // 将用户是否已经登录的布尔值返回给客户端
  res.json({
    is_login: session !== undefined
  })
})

app.get('/credit', (req, res) => {
  var session = db.session[req.query.token]
  if (session && db.user[session.openid]) {
    res.json({
      credit: db.user[session.openid].credit
    })
  } else {
    res.json({
      err: '用户不存在，或未登录。'
    })
  }
})

//响应数据中间件，一定要在路由前
app.use((req, res, next) => {
  // status 默认值为1，表示失败的情况
  // err 的值，可能是一个错误对象，也可能是一个错误的描述字符串
  res.cc = function (err, status = 1) {
    res.send({
      status,
      message: err instanceof Error ? err.message : err,
    });
  };
  next();
});
app.use(
  expressJWT({ secret: secret.jwtSecretKey }).unless({ path: [/^\/user\//] })
); // 配置解析token的中间件
app.use((req, res, next) => {
  // 配置全局正确中间件
  res.zz = function (msg, data, status = 0) {
    res.send({
      status,
      message: msg instanceof Error ? msg.message : msg,
      data,
    });
  };
  next();
});

app.use((req, res, next) => {
  // 配置全局正确中间件
  res.zz = function (msg, data, status = 0) {
    res.send({
      status,
      message: msg instanceof Error ? msg.message : msg,
      data,
    });
  };
  next();
});

// 配置跨域请求头

app.all("*", function (req, res, next) {
  res.header("Access-Control-Allow-Credentials", "true");
  res.header("Access-Control-Allow-Origin", "*"); //允许所有跨域请求
  res.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");
  res.header("Access-Control-Allow-Origin", "*"); // 设置允许来自哪里的跨域请求访问（值为*代表允许任何跨域请求，但是没有安全保证）
  res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS"); // 设置允许接收的请求类型
  res.header("Access-Control-Allow-Headers", "Content-Type,request-origin"); // 设置请求头中允许携带的参数
  next();
});



//导入用户路由
const userRouter = require("./router/user.js");
app.use("/user", userRouter);

//导入上传路由
const fileRouter = require("./router/file.js");
app.use("/file", fileRouter);
 
// 配置错误级别的中间件
app.use((err, req, res, next) => {
  if (err instanceof joi.ValidationError) return res.cc(err); // 参数校验失败
  if (err.name === "UnauthorizedError") return res.cc("身份认证失败！", 401); // 身份认证失败
  res.cc(err); // 未知的错误
});
 

app.listen(3001, () => {
  console.log("服务端启动成功，http://127.0.0.1:3001");
});
module.exports = app;
